linux静态库 动态库 去符号 符号恢复 您所在的位置:网站首页 cold play主唱 章子怡 linux静态库 动态库 去符号 符号恢复

linux静态库 动态库 去符号 符号恢复

#linux静态库 动态库 去符号 符号恢复| 来源: 网络整理| 查看: 265

前言

最近遇到了一题去除符号的题目,需要进行符号修复。为此学习了一波,顺便补了补其它的一下知识。

准备知识

命名方式:

动态库libxxx.so.major.minor .so .dll 静态库:libxxx.a .a .lib

生成动态库 gcc -shared -o libxxx.so.1.0 hello.o 生成静态库 ar cqs libxxx.a hello.o 用于设置动态库的路径 export LD_LIBRARY_PATH 用于设置静态库的路径 export LIBRARY_PATH

ldd工具:查看依赖的动态库和静态库 nm工具:查看静态库和动态库中的函数名。T类当前库中定义的,U类表示是被调用的,W类表示可能被覆盖的 strip工具 可以去除程序的符号,缩小程序体积 在linux下gcc默认的编译选项就是动态库 ar -r 更新静态库 ar -d -v libxxx.a module.o 删除静态库中的某一模块 ar -t libxxx.a 列出静态库中包含的模块 ar -s 相当于ranlib,用于更新符号索引表

实验

首先我自己写了个简单的hello程序 这里写图片描述

动态链接

这里写图片描述

这里写图片描述 IDA下查看 这里写图片描述 使用strip 去除符号 这里写图片描述

静态链接 gcc -static t.c -o t

使用nm查看时可以看到大量的输出。 这里写图片描述 ldd的输出 这里写图片描述 使用strip去除符号后同动态链接类似。 使用IDA打开…

恢复符号-FLIRT签名技术

注意一下相关工具在ida的目录下,可以找到flirt.zip,解压出来即可 建议看一下flirt的readme.txt。

Typical scenario of a signature creation is: - run a parser and create pattern (PAT) files - run sigmake and get EXC file with collisions - edit EXC file and resolve collisions - run sigmake again and get SIG file - repeat the above 2 steps till collisions exist - run zipsig and get compressed SIG file

注意一下不同环境下的库文件,用来生成PAT文件的工具时不同的,linux下使用pelf工具生成PTA

plb.exe/plb——OMF库的解析器(Borland编译器常用) pcf.exe/pcf——COFF库的解析器(微软编译器常用) pelf.exe/pelf—— ELF库的解析器(许多Unix系统常用) ppsx.exe/ppsx—— 索尼PlayStation PSX的库解析器 ptmobj.exe/ptmobj——TriMedia库的解析器 pomf166.exe/pomf166——Kiel OMF 166对象文件的解析器

我在尝试使用pelf生成pat时,一直报错,我认为是因为libc的版本原因。 这里写图片描述 随后我在晚上下载了一个低版本的libc.a文件,可以正常的生成pat文件。 接下来使用sigmake GCC.pat GCC.sig生成签名文件。 这里写图片描述 可以看到有13个冲突,要想成功的生成签名文件就必须解决冲突,同时我们还可以看到生成了.exc文件 这里写图片描述 查看内容如下图: 这里写图片描述 可以看到说明,由于某些函数的签名相同,因此sigmake需要你来决定该如何抉择。”+”代表应用该函数,”-“代表只在数据库中添加该函数的注释,不做处理代表你不想应用任何一个函数。 在解决冲突时需要注意以下几点:

1. 为最大限度地减少冲突,请删除排斥文件开头的四个注释行。 2. 最多只能给冲突函数组中的一函数附加+/-。 3. 如果一个冲突函数组仅包含一个函数,不要在该函数前附加+/-,让它保持原状即可。 4. sigmake连续运行失败会将包括注释行的数据附加到现有的任何排斥文件后。再次运行sigmake之前,必须删除这些附加数据,并更正原始数据(如果这些数据正确,sigmake将不会再次运行失败)。

修改.exc文件后重新使用sigmake GCC.pat GCC.sig命令,如果不在报错,说明sig签名文件生成。 将签名文件拷贝到IDA的/sig/pc目录下(这个路径找了好久,网上很多教程说放在/sig目录下即可,但是7.0的ida需要放在/sig/pc目录下才能被正确识别,同时注意flair的版本同ida的版本要对应!) IDA中使用shift+F5,然后右键【Apply new signature…】窗口,选择生成的sig签名文件。 这里写图片描述 最终成功的匹配上了46个func,这是因为用来生成签名的libc.a版本太低了,而高版本的又生成不了签名文件。(我也不知道是不是因为版本的问题)

总结

这篇文章只是基础的知识。linux就是需要多折腾!

参考文章

https://blog.csdn.net/txx_683/article/details/53454426 http://drops.xmd5.com/static/drops/mobile-9797.html http://www.voidcn.com/article/p-gtapvefh-bat.html https://www.jianshu.com/p/2ec7ee43e3a1



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有